﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace TriangleGame
{
    public partial class Partita : PhoneApplicationPage
    {
        private int turno;
        private Giocatore g1;
        private Giocatore g2;
        private Griglia gr;
        private Punto selezionato; //punto selezionato
        private Button ellsel; //ellisse selezionata
        private List<Line> linee; //lista di supporto che mi serve per cancellare le linee di aiuto
        private int triangolig1; //numero di triangoli di g1
        private int triangolig2; //numero di triangoli di g2

        public Partita()
        {
            InitializeComponent();
            this.turno = 0;
            linee = new List<Line>();
            this.triangolig1 = 0;
            this.triangolig2 = 0;

            var nomeg1 = PhoneApplicationService.Current.State["nomeg1"]; //prendo i dati dallo stato dell'app
            var nomeg2 = PhoneApplicationService.Current.State["nomeg2"];
            var numrighe = PhoneApplicationService.Current.State["numcolonne"];
            var numcolonne = PhoneApplicationService.Current.State["numrighe"];
            this.g1 = new Giocatore((string)nomeg1);
            this.g2 = new Giocatore((string)nomeg2);
            this.gr = new Griglia((int)numrighe,(int)numcolonne);

            EP1.Visibility = System.Windows.Visibility.Visible; //turno di g1
            EP2.Visibility = System.Windows.Visibility.Collapsed;

            foreach(Punto p in gr.getPunti()){ //creo la griglia visiva
                Button el = new Button();//ellisse
                el.Background = new SolidColorBrush(Colors.White);
                el.BorderBrush = new SolidColorBrush(Colors.White);
                el.Height = 40;
                el.Width = 40;
                el.Tag = p;
                Tabella.Children.Add(el);
                Canvas.SetZIndex(el, 100);
                Canvas.SetLeft(el,0+(310.0 / (gr.getX()-1) * (p.getX()-1)));
                Canvas.SetTop(el, 310 - (310.0 / (gr.getY()-1) * (p.getY()-1)));
                el.Tap+=new EventHandler<GestureEventArgs>(el_Tap);
            }

            testog1.Text = g1.getNome() + "\n Score: " + g1.getArea().ToString();
            testog2.Text = g2.getNome() + "\n Score: " + g2.getArea().ToString();
        }//costruttore


        private void el_Tap(object sender, EventArgs e)
        {
            var ellisse = sender as Button;
            var p = ellisse.Tag as Punto;

            if (p.Equals(selezionato)) //sto ricliccando il punto
            {
                selezionato = null;
                ellsel.Background = new SolidColorBrush(Colors.White); //deseleziono l'ellisse visivamente
                ellsel.BorderBrush = new SolidColorBrush(Colors.White);
                foreach(Line l in linee){ //rimuovo le linee
                    Tabella.Children.Remove(l);
                }
                linee.RemoveRange(0, linee.Count());
            }
            else if (selezionato != null) //sto collegando 2 punti
            {
                if (gr.ControllaMossa(p, selezionato)) //se la mossa è consentita collego i 2 punti e continuo
                {
                    foreach (Line l in linee) //rimuovo le linee
                    { 
                        Tabella.Children.Remove(l);
                    }
                    ellsel.Background = new SolidColorBrush(Colors.White); //deseleziono l'ellisse visivamente
                    ellsel.BorderBrush = new SolidColorBrush(Colors.White); //deseleziono l'ellisse visivamente
                    linee.RemoveRange(0, linee.Count());

                    Line line = new Line(); //disegno la linea che collega i 2 punti
                    line.X1 = Canvas.GetLeft(ellisse) + 20;
                    line.Y1 = Canvas.GetTop(ellisse) + 20;
                    line.X2 = (int)(0 + (310.0 / (gr.getX() - 1) * (selezionato.getX() - 1))) + 20;
                    line.Y2 = (int)(310 - (310.0 / (gr.getY() - 1) * (selezionato.getY() - 1))) + 20;
                    line.Stroke = new SolidColorBrush(Colors.White);
                    line.StrokeThickness = 4;
                    Tabella.Children.Add(line);

                    List<Punto> ls = gr.TrovaTriangolo(p,selezionato);
                    foreach (Punto q in ls)
                    {
                        Polygon triangolo = new Polygon(); //creo il triangolo
                        Point punto1 = new Point(Canvas.GetLeft(ellisse) + 20, Canvas.GetTop(ellisse) + 20);
                        Point punto2 = new Point((0 + (310.0 / (gr.getX() - 1) * (selezionato.getX() - 1))) + 20, (310 - (310.0 / (gr.getY() - 1) * (selezionato.getY() - 1))) + 20);
                        Point punto3 = new Point((0 + (310.0 / (gr.getX() - 1) * (q.getX() - 1))) + 20, (310 - (310.0 / (gr.getY() - 1) * (q.getY() - 1))) + 20);
                        PointCollection puntitriangolo = new PointCollection();
                        puntitriangolo.Add(punto1);
                        puntitriangolo.Add(punto2);
                        puntitriangolo.Add(punto3);
                        triangolo.Points = puntitriangolo;
                        if (turno == 0) //coloro il triangolo a seconda del giocatore e assegno l'area
                        {
                            triangolo.Stroke = new SolidColorBrush(Color.FromArgb(255, 104, 213, 201));
                            triangolo.Fill = new SolidColorBrush(Color.FromArgb(255, 104, 213, 201));
                            g1.AumentaArea(gr.AreaTriangolo(p,selezionato,q));
                            triangolig1++;
                            testog1.Text = g1.getNome() + "\n Score: " + triangolig1.ToString();
                        }
                        else
                        {
                            triangolo.Stroke = new SolidColorBrush(Color.FromArgb(255, 179, 69, 148));
                            triangolo.Fill = new SolidColorBrush(Color.FromArgb(255, 179, 69, 148));
                            g2.AumentaArea(gr.AreaTriangolo(p, selezionato, q));
                            triangolig2++;
                            testog2.Text = g2.getNome() + "\n Score: " + triangolig2.ToString();
                        }
                        Tabella.Children.Add(triangolo);
                    }
                    if (ls.Count == 0) //cambio di turno
                    {
                        turno = turno = (turno + 1) % 2;
                    }

                    if (turno == 0) //gestisco il turno visivamente
                    {
                        EP1.Visibility = System.Windows.Visibility.Visible;
                        EP2.Visibility = System.Windows.Visibility.Collapsed;
                    }
                    else
                    {
                        EP1.Visibility = System.Windows.Visibility.Collapsed;
                        EP2.Visibility = System.Windows.Visibility.Visible;
                    }

                    gr.Linka(selezionato, p);
                    gr.AggiornaADJ(selezionato, p);
                    selezionato = null;

                    //gestisco la fine della partita 
                    double area = (gr.getX()-1) * (gr.getY()-1);
                    double a = g1.getArea() + g2.getArea();
                    double range =Math.Abs(a - area);

                    if (range>=0 && range<=0.1)
                    {
                        int vincitore = CalcolaVincitore();
                        switch (vincitore)
                        {
                            case 0: 
                                MessageBox.Show("Draw");
                                break;
                            case 1: 
                                MessageBox.Show(g1.getNome() + " won");
                                break;
                            case 2:
                                MessageBox.Show(g2.getNome() + " won");
                                break;
                        }
                        
                    }

                }
                else //se la mossa non è consentita tocca ancora a quel giocatore
                {
                    MessageBox.Show("Move not allowed");
                }           
            }
            else //sto selezionando il primo punto
            {
                selezionato = p;
                ellsel = ellisse;
                ellsel.Background = new SolidColorBrush(Colors.Yellow); //deseleziono l'ellisse visivamente
                ellsel.BorderBrush = new SolidColorBrush(Colors.Yellow);
                foreach (Tupla t in gr.getLista()) //illumino i possibili collegamenti
                {
                    if (p.Equals(t.getPuntoA()) && t.getLinked() == false)
                    {
                        Line line = new Line();
                        line.X1 = Canvas.GetLeft(ellisse) + 20;
                        line.Y1 = Canvas.GetTop(ellisse) + 20;
                        line.X2 = (int)(0 + (310.0 / (gr.getX() - 1) * (t.getPuntoB().getX() - 1))) + 20;
                        line.Y2 = (int)(310 - (310.0 / (gr.getY() - 1) * (t.getPuntoB().getY() - 1))) + 20;
                        line.Stroke = new SolidColorBrush(Colors.White);
                        DoubleCollection tratteggio = new DoubleCollection();
                        tratteggio.Add(4);
                        tratteggio.Add(2);
                        line.StrokeDashArray = tratteggio;
                        linee.Add(line);
                        Tabella.Children.Add(line);
                    }
                }
            }
        }//evento tap

        public int CalcolaVincitore()
        {
            double range = Math.Abs(g1.getArea()-g2.getArea());

            if (range >= 0 && range <= 0.1)
                return 0;
            else if (g1.getArea() > g2.getArea())
                return 1;
            else
                return 2;
        }//CalcolaVincitore
    } 
}

       